Análisis de la siniestralidad en accidentes de automóviles

El objetivo de este proyecto es predecir si en un accidente de carretera, dada unas características, se va a producir algún fallecimiento, para que, como aseguradora, se pueda calcular la provisión necesaria.

Para poder conseguirlo, primero se analizará el conjunto de datos, para poder obtener un conocimiento del área, y posteriormente, realizar una predicción mediante distintos modelos.

Los pasos a seguir en este trabajo son:

Diccionario de los datos

Para hacer un mejor análisis, estudiaremos las variables de nuestro dataset para ver que información aporta cada una.

Variables temporales

Variables de la colisión

Variables del automóvil

Variables personales

Análisis Exploratorio de los Datos

Procedemos a la lectura de los datos. En este caso, usaremos una base de datos de accidentes de coches ocurridos en Canadá entre 1999 y 2014

Nuestro dataset está compuesto por 22 columnas de tipo Object excepto el año del accidente (C_YEAR) y la severidad del accidente (C_SEV). Por otro lado, tenemos 5.860.405 entradas, que corresponden a cada elemento involucrado en un accidente, pudiendo ser personas conductores [de todo tipo de vehículos], pasajeros, peatones, ciclistas o motoristas) o vehículos, si no había personas en su interior.

La gran mayoría de nuestro dataset (20 variables) son de tipo object donde cada número representa una categoría distinta, diferente en cada variable, por lo que más adelante tendremos que hacer un encoding de estas variables.

Análisis general de la tabla

Vemos las dimensiones de la tabla y si existen filas duplicadas.

Como se observa, en nuestro dataframe tenemos varias filas duplicadas, que procedemos a eliminar, quedándose el dataset con 5.855.336 filas y las 22 columnas.

Análisis de la variable objetivo

Como hemos mencionado anteriormente, nuestro objetivo principal es predecir si va a fallecer alguna persona en un accidente de tráfico. Por ello, elegimos como variable objetivo C_SEV, que nos informa sobre si en el accidente hay uno o más fallecidos (Valor 1) o si no hay (Valor 2).

Como se observa, el 98.32% (5.756.720) de los elementos involucrados (vehículos o personas), han participado en accidentes donde no se ha producido ningún fallecimiento, frente al 1.68% en los que si hubo.

Valores nulos

A continuación vamos a observar si existen valores nulos en nuestro dataset.

Existen 3 valores nulos en la columna C_VEHS, que informa sobre el número de vehículos involucrados en el accidente. No obstante, hemos podido observar que existen categorías con valores desconocido, como U (Unknown), y valores que la jurisdicción no aporta (X) por lo que procedemos a convertirlos en NA.

Volvemos a contar los valores nulos de nuestro dataset.

Exploración gráfica de la tabla

Variable C_MNTH

Esta variable indica el mes en el que se produjo el accidente. Como observamos, existen categorías (meses) duplicadas, por lo que debemos tratarla para poder trabajar con ella.

Gráficamente se observa como los meses de verano, es donde se existe un mayor número de individuos involucrados en accidentes, en contraste con los invernales. Canadá al ser uno de los países con mayor altitud del hemisferio norte, tiene unos inviernos muy fríos (con temperaturas de entre -25 y -30 grados) y veranos muy calurosos (temperaturas rondando los 30 grados). Todo ello hace que los canadienses salgan más de sus casas entre los meses de verano y otoño, coinicidiendo además con los periodos vacacionales.

Adicionalmente, podemos destacar que uno de los meses con mas accidentes es diciembre, pudiendo ser explicado por las compras y festejos navideños.

Variable C_WDAY

Al igual que pasa con los meses del año, debemos tratar los días de la semana, pues existen valores duplicados.

Como se observa, el día de la semana en el que ocurren más accidentes es el viernes, coincidiendo con el comienzo del fin de semana.

Variable C_HOUR

Cuando más accidentes se registran es a las 16 horas, seguido por las 17 y 15 horas. Esto puede ser explicado por la salida del trabajo de muchos canadienses junto con la salida de los pequeños de sus colegios.

Variable C_RCFG

Esta variable indicará dónde se ha producido el accidente. Para un mayor entendimiento, vemos las diferentes categorías.

A continuación, graficamos el porcentaje de los fallecidos en los accidente por el tipo de carretera donde circulaban.

El gráfico anterior, nos muestra el número de accidentes por la zona donde se circulaba. Además se observa el porcentaje de fallecimientos en función del total de accidentes (linea azul discontinua).

Con ello se puede ver que donde más fallecimientos se producen (de manera relativa) son los carriles de adelantamiento (climbing lane), mientras que de manera absoluta, son los pasos de peatones y en los cruces, pues de éstos existen un número mayor.

Variable V_TYPE

Vemos el tipo de vehículos con el que más accidentes se producen.

Como era de esperar, al ser el vehículo más utilizado, el coche (light duty vehicles [1]) son los que más accidentes causan. Hay que destacar también los accidentes de furgonetas (6), motos (14) y bicicletas (16). Por otro lado, se observa la categoría "NN", que es la etiqueta asignada a los peatones.

Para observarlo mejor, vamos a graficar también por el total de accidentes de coches, de manera relativa.

En función del total de accidentes, el vehículo que más fallecimientos produce son los vehículos (laborales) de construcciones o granja (20 y 19). Con ello se puede observar cómo el número de fallecimientos, en función del total, se reduce en los vehículos más convencionales.

Variable P_ISEV

La variable P_ISEV, va a mostrar el grado de alcance causado por el accidente. El número de fallecidos (3) es de 40.347 personas, mientras que el número de heridos (cualquier tipo de lesión) asciende hasta 3 millones de personas. Cabe destacar que la categoría "N" corresponde a los coches.

También es importante mencionar que el número de fallecidos que aparece es esta variable difiere con los aparecidos en P_ISEV. Esto es, como ya mencionamos anteriormente, porque C_SEV aparece agrupada por accidente, es decir, que si se ha producido algñun fallecimiento en ese accidente, aparecerá un "1" en todas las filas del mismo.

Variable P_SAFE

El gráfico anterior va a relacionar la variable P_SAFE, que indica el elemento de seguridad utilizado y si se produjo fallecimientos o no. Con ello se evidencia que los usuarios que no utilizaban ningún tipo de protección tienen mayor probabilidad a fallecer.

Variable P_USER

Se ha realizado un gráfico donde se relaciona el papel que juega cada individuo en relación al accidente. Viendo el porecentaje de fatalidad, vemos como los peatones y los motoristas son los más afectados.

Variable C_WTHR

El gráfico nos muestra que el mayor número de accidentes se produce en días soleados, seguidos de los nublados y con precipitaciones de agua o nieve. Sin embargo hay que destacar que de manera relativa, se producen más fallecimientos en relación con el total en días con niebla o fuertes vientos.

Realación entre variable C_WTHR y C_RSUR

Tal y como se puede observar en el gráfico anterior, se ve como cuando el día está soleado la carretera está seca y no peligrosa. Por otro lado, cuando se pruducen precipitaciones (R_WTHR = 3) la superficie de la carretera está mojada (R_SUR = 2).

Variable P_SEX

Variable P_AGE

Como se observa, el número de accidentes principalmente se concentra en los conductores más jóvenes, pudiendo ser explicado porque son conductores nóveles sin experiencia.

Tratamiento de los datos

Preprocesamiento de variables

Antes de comenzar el procesamiento de las variables, convertimos los valores de nuestra variable objetivo en 0 (si no hay fallecidos) y 1 (si los hay).

Como el objetivo principal del modelo es saber si en una accidente se van a producir o no fallecimientos, en las variables donde se identifica a la persona, los datos que pertenecen solo a coches no nos sirven.

Variable P_SEX

Variable P_ID

Esta variable va a dar diferentes números a las personas que se encontraban dentro del mismo vehículo. Continuando con el objetivo anterior, vamos a eliminar aquellas filas con los vehículos vacíos.

Variable P_PSN

Esta variable nos indica la posición en la que se encontraban las diferentes personas. Como hacemos con la variable P_ID, eliminamos los coches vacíos.

Variable P_ISEV

La siguiente variable nos indica el grado de daño causado por el accidente, por lo que cuando se trata de un vehículo, no existen daños personales.

Variable P_SAFE

P_SAFE nos indica el elemento de seguridad utilizado en el accidente. Los automóviles no nos proporcionan la información necesaria.

Variable P_USER

P_USER nos indica el tipo de usuario, si el accidentado fue un conductor de coche, motorista, peatón u otro. Por lo que en esta variable no hay nada que eliminar.

Como se observa acontinuación, se han eliminado un elevado número de filas de nuestro dataset y como la proporción de nuestra variable objetivo no varía significativamente podemos decir que esas filas no nos aportaban gran información para el estudio.

Convertimos las categorías asociadas a los peatones ("NN" y "NNNN"), con el valor 0 para posteriormente poder llevar a cabo los encoding.

Variable C_V_YEAR

Una vez estudiado el dataset, observamos que la variable V_YEAR (año de matriculación del vehículo), no nos aporta ninguna información al igual que C_YEAR (año del accidente). Sin embargo, la información que si es relevante es el año de antiguedad del vehículo en el momento del accidente, pues los vehículos más antiguos causan más accidentes.

Por ello, hemos creado la variable C_V_YEARS, que consiste en la diferencia entre esos años. Para evitar los posibles valores nulos, los eliminamos antes de la creación de la variable.

Codificación de variables

Como estamos tratando con variables categóricas, va a ser necesario realizar la codificación de variables para poder trabajar con ellas.

Mean Encoding

El mean encoding consiste en sustituir nuestra variable categórica por una única nueva variable numérica que, va a dar información sobre la variable objetivo. Por lo que se va a crear una relación monótona entre ambas variables. Esto sucede porque por cada categoría única que tenga esa variable se calcula la media correspondiente a sus valores en la variable objetivo.

Cyclical Encoding

Adicionalmente, con el objetivo de tratar los datos temporales (día de la semana, hora y mes) con el mismo peso, tenemos que hacer una codificación cíclica.

Como ya hemos hecho el cyclical encoding, las variables temporales "C_HOUR", "C_MNTH", "C_WDAY" no nos van a aportar mas información, por lo que las eliminamos.

Para confirmar que se etá ejecutando correctamente el cyclical encoding, ploteamos las variables de las horas.

Existen variables que agrupan los valores que no se muestran anteriormente como "Q" o "QQ", para poder hacer el mean encoding, las transformamos en un número (100).

Imputación de valores missing Variable C_MNTH

La imputación de la variable C_MNTH (tanto de senos como de cosenos), la vamos a realizar mediante el método fillna, que transformará los NA en el valor anterior. Esto es porque es más probable que el mes faltante sea el mismo que el del dato anterior. Por eso lo hacemos antes de dividir el set en train y test.

Matriz de correlaciones

A continuación vamos a estudiar las correlaciones de las variables. Para ello vamos a utilizar el coeficiente de correlación de Spearman porque estamos tratando con variables categóricas. Antes de comenzar con el estudio, vamos a transformar todas las variables a float.

Una vez calculadas la matriz de correlaciones, podemos observar que nuestra variable objetivo (C_SEV) mantiene una correlación positiva no muy elevada con todas las variables, excepto con las temporales (mes y día de la semana). Por otro lado destacamos una correlación más positiva con las variables P_ISEV (básicamente aporta la misma información como el número de fallecidos) y la variable C_CONF, que indica la configuración de la carretera donde se produce el accidente.

Las más correlacionadas son el tipo de vehículo y la configuración de la carretera, pues no todos los vehículos, circulan por el mismo tipo de vías. Hay que destacar también la relación existente entre las variables temporales (seno y coseno).

Las variables posición del coche (P_PSN) y el usuario del vehículo (P_USER), están positivamente correlacionados, pues básicamente aportan la misma información (conductor, motorista, ciclista...).

Por último el sexo del conductor y el grado de severidad del accidente se correlacionan positivamente, por lo que los hombres estadísticamente mueren más que las mujeres, o la posición que ocupaba en el coche.

Separación en train y test

Tratamiento de NA`s del set de Train

Variable sin_C_WDAY y cos_C_WDAY

Variables sin_C_HOUR y sin_C_HOUR

Al existir diferencias entre los días laborables y no laborables, imputaremos los valores nulos, en función de la moda horaria, de cada día de la semana.

Tratamiento de NA`s del set de Test

Se imputarán los valores nulos de estas variables en función de la moda del set de train.

Variable sin_C_WDAY y cos_C_WDAY

Variables sin_C_HOUR y sin_C_HOUR

Al igual que hicimos con el train, se imputarán los valores nulos de las horas por la moda en función del día de la semana.

Una vez imputados los valores nulos, podemos volver a dividir el set en x e y train.

Escalado de variables

Una vez imputados los valores nulos y dividir en train y test, podemos proceder el escalado de variables.

Oversampling

Como se ha observado a lo largo de todo el análisis, se observa un número muy pequeño de valores tipo 1 (fallecidos) respecto a los 0. Esto va a hacer que el modelo entrene de manera errónea, por lo que llevaremos a cabo un oversampling. Esto generará filas con valores 1, para equilibrar el dataset y entrenar correctamente el modelo.

Guardamos los datos

Guardamos los datos generados a lo largo del análisis, para la producción de los modelos.